android中内存信息的获取

您所在的位置:网站首页 android 查看进程内存 android中内存信息的获取

android中内存信息的获取

2023-11-04 22:15| 来源: 网络整理| 查看: 265

获取进程最大物理内存

http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); int totalMemoryM activityManager.getMemoryClass();

通过注释可以看出,返回的进程分配的最大物理内存,包含native heap 和java heap,单位是M,不同的手机可能不同。Bitmap在native heap分配。

/** * Return the approximate per-application memory class of the current * device. This gives you an idea of how hard a memory limit you should * impose on your application to let the overall system work best. The * returned value is in megabytes; the baseline Android memory class is * 16 (which happens to be the Java heap limit of those devices); some * device with more memory may return 24 or even higher numbers. */ public int getMemoryClass() { return staticGetMemoryClass(); }

这个值的读取其实读取vm的配置参数dalvik.vm.heapgrowthlimit 或者dalvik.vm.heapsize,前面介绍过:

/** @hide */ static public int staticGetMemoryClass() { // Really brain dead right now -- just take this from the configured // vm heap size, and assume it is in megabytes and thus ends with "m". String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", ""); if (vmHeapSize != null && !"".equals(vmHeapSize)) { return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); } return staticGetLargeMemoryClass(); } /** @hide */ static public int staticGetLargeMemoryClass() { // Really brain dead right now -- just take this from the configured // vm heap size, and assume it is in megabytes and thus ends with "m". String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m"); return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); } 获取native相关内存信息

通过Debug类获取 http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/os/Debug.java getNativeHeapSize:获取native堆大小。 getNativeHeapAllocatedSize:获取native堆已占用的大小 getNativeHeapFreeSize:获取native堆可用的大小

/** * Returns the size of the native heap. * @return The size of the native heap in bytes. */ public static native long getNativeHeapSize(); /** * Returns the amount of allocated memory in the native heap. * @return The allocated size in bytes. */ public static native long getNativeHeapAllocatedSize(); /** * Returns the amount of free memory in the native heap. * @return The freed size in bytes. */ public static native long getNativeHeapFreeSize(); 获取当前进程的内存情况

android.os.Debug.getMemoryInfo(MemoryInfo memoryInfo)

/** * Retrieves information about this processes memory usages. This information is broken down by * how much is in use by dalivk, the native heap, and everything else. */ public static native void getMemoryInfo(MemoryInfo memoryInfo); 获取系统的内存情况

ActivityManager.getMemoryInfo(MemoryInfo memoryInfo)

/** * Return general information about the memory state of the system. This * can be used to help decide how to manage your own memory, though note * that polling is not recommended and * {@link android.content.ComponentCallbacks2#onTrimMemory(int) * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this. * Also see {@link #getMyMemoryState} for how to retrieve the current trim * level of your process as needed, which gives a better hint for how to * manage its memory. */ public void getMemoryInfo(MemoryInfo outInfo) { try { ActivityManagerNative.getDefault().getMemoryInfo(outInfo); } catch (RemoteException e) { } }

从MemoryInfo可以获得到的内存信息:可用内存,总内存,内存阈值,是否低内存状态,以及一些其他的内存阈值

/** * Information you can retrieve about the available memory through * {@link ActivityManager#getMemoryInfo}. */ public static class MemoryInfo implements Parcelable { /** * The available memory on the system. This number should not * be considered absolute: due to the nature of the kernel, a significant * portion of this memory is actually in use and needed for the overall * system to run well. */ public long availMem; /** * The total memory accessible by the kernel. This is basically the * RAM size of the device, not including below-kernel fixed allocations * like DMA buffers, RAM for the baseband CPU, etc. */ public long totalMem; /** * The threshold of {@link #availMem} at which we consider memory to be * low and start killing background services and other non-extraneous * processes. */ public long threshold; /** * Set to true if the system considers itself to currently be in a low * memory situation. */ public boolean lowMemory; /** @hide */ public long hiddenAppThreshold; /** @hide */ public long secondaryServerThreshold; /** @hide */ public long visibleAppThreshold; /** @hide */ public long foregroundAppThreshold; public MemoryInfo() { } //省略 }

如果通过上面的方法获取不到,请读取系统文件/proc/meminfo获取

获取vm相关的使用率及最小堆大小

这些数据对GC有比较大的影响,可以调整HeapUtilization值

VMRuntime.getTargetHeapUtilization() ; VMRuntime.getMinimumHeapSize(); VMRuntime.getExternalBytesAllocated();


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3